package email

import (
	"sync"

	"github.com/cloudwego/hertz/pkg/common/hlog"
	"gopkg.in/gomail.v2"
)

var (
	client *Client
	once   sync.Once
)

type Client struct {
	config *Config
}

func (c *Client) Send(email, title, content string, attachs ...string) (err error) {

	m := gomail.NewMessage()
	//m.SetHeader("From",  m.FormatAddress(mailConn["user"], "XX官方")) //这种方式可以添加别名，即“XX官方”
	//说明：如果是用网易邮箱账号发送，以下方法别名可以是中文，如果是qq企业邮箱，以下方法用中文别名，会报错，需要用上面此方法转码
	//m.SetHeader("From", "FB Sample"+"<"+mailConn["user"]+">") //这种方式可以添加别名，即“FB Sample”， 也可以直接用<code>m.SetHeader("From",mailConn["user"])</code> 读者可以自行实验下效果
	m.SetHeader("From", c.config.user)
	m.SetHeader("To", email)        //发送给多个用户
	m.SetHeader("Subject", title)   //设置邮件主题
	m.SetBody("text/html", content) //设置邮件正文
	for _, v := range attachs {
		m.Attach(v)
	}
	d := gomail.NewDialer(c.config.host, c.config.port, c.config.user, c.config.pass)
	return d.DialAndSend(m)
}

// 包级初始化函数
func Init(config *Config) {
	once.Do(func() {
		client = &Client{config: config}
	})
}

// 使用时直接获取实例
func ClientInst() *Client {
	if client == nil {
		hlog.Fatalf("email模块未初始化，请先调用email.Init()")
	}
	return client
}
